package com.youdianda.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.youdianda.constant.MessageConstant;
import com.youdianda.dto.SysMenuDto;
import com.youdianda.dto.SysMenuUpdateDto;
import com.youdianda.entity.SysMenu;
import com.youdianda.mapper.SysMenuMapper;
import com.youdianda.result.Result;
import com.youdianda.service.ISysMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youdianda.vo.SysMenuVO;
import org.aspectj.weaver.ast.Var;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author sdy
 * @since 2023-05-15
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {

    /**
     * 新增菜单
     *
     * @param sysMenuDto@return
     */
    @Override
    public Result sysMenuAdd(SysMenuDto sysMenuDto) {
        //判断数据是否为空
        if (sysMenuDto == null) {
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
        //创建一个sysmenu对象 将前端获取的数据进行copy
        SysMenu sysMenu = new SysMenu();
        BeanUtils.copyProperties(sysMenuDto, sysMenu);
        //补充数据修改格式

        sysMenu.setIsCache(Integer.parseInt(sysMenuDto.getIsCache()));
        sysMenu.setPid(Integer.parseInt(sysMenuDto.getPid()));
        sysMenu.setIsLink(Integer.parseInt(sysMenuDto.getIsLink()));
        sysMenu.setIsShow(Integer.parseInt(sysMenuDto.getIsShow()));
        sysMenu.setSort(Integer.parseInt(sysMenuDto.getSort()));
        sysMenu.setCreateDate(LocalDateTime.now());
        sysMenu.setUpdateDate(LocalDateTime.now());
        //添加数据到数据库
        save(sysMenu);
        //响应结果
        return Result.success();
    }

    /**
     * 查看所有菜单
     *
     * @return
     */
    @Override
    public Result sysMenuAllData() {
        //终极目的是获取表中所有的数据,情况会出现分级的情况我的实现方法是
        // 用一个vo来返回数据  vo里面带了一个集合 第三级的是数据
        // 将第三级的数据封装到第二级的数据里面的集合中  再将第二级的数据封装到第一级的集合中
        //创建mybatisplus构造器 通过pid属性为0查询数据 这一个集合里面的数据是一级数据
        List<SysMenu> list2 = list(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getPid, 0));//一级数据的集合
//        //创建三个集合  将获取的数据封装到集合中
//        ArrayList<SysMenuVO> sysMenuVOS1 = new ArrayList<>();
//        ArrayList<SysMenuVO> sysMenuVOS2 = new ArrayList<>();
//        ArrayList<SysMenuVO> sysMenuVOS3 = new ArrayList<>();
        //通过遍历一级数据 获取对应的id的作为二级数据的pid 来查询二级数据
        list2.forEach(s2 -> {
            List<SysMenu> list3 = list(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getPid, s2.getId()));
//            SysMenuVO sysMenuVO1 = new SysMenuVO();
//            BeanUtils.copyProperties(s2, sysMenuVO1);
            s2.setChildren(list3);
//            sysMenuVOS1.add(sysMenuVO1);
            //通过遍历二级数据 获取对应的id作为三级数据的pid 来查询三级数据
            list3.forEach(s3 -> {
                List<SysMenu> list = list(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getPid, s3.getId()));
                //遍历三级数据 将三级数据封装到三级集合中
//                SysMenuVO sysMenuVO2 = new SysMenuVO();
//                BeanUtils.copyProperties(s3, sysMenuVO2);
                s3.setChildren(list);
//                sysMenuVOS2.add(sysMenuVO2);
//                list.forEach(sysMenu -> {
//                    SysMenuVO sysMenuVO3 = new SysMenuVO();
//                    BeanUtils.copyProperties(sysMenu, sysMenuVO3);
//                    sysMenuVOS3.add(sysMenuVO3);
//                });
            });
        });
        //返回数据
        return Result.success(list2);
    }
    /**
     * 查询菜单详情 根据id查询
     *
     * @param id
     * @return
     */
    @Override
    public Result sysMenuRowlnfo(Integer id) {
        //非空判断
        if (id == null) {
            return Result.error(MessageConstant.ACCOUNT_NOT_FOUND);
        }
        //根据id查询数据
        SysMenu sysMenu = getById(id);
        //返回结果
        return Result.success(sysMenu);
    }

    /**
     * 修改单条数据
     *
     * @param dto
     * @return
     */
    @Override
    public Result sysMenuUpdate(SysMenuUpdateDto dto) {
        //非空判断
        if (dto == null) {
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
        //新建一个sysMenu对象 将前端的对象进行copy
        SysMenu sysMenu = new SysMenu();
        BeanUtils.copyProperties(dto, sysMenu);
        //调用方法进行修改
        sysMenu.setUpdateDate(LocalDateTime.now());
        updateById(sysMenu);
        //响应结果
        return Result.success();
    }

    /**
     * 根据id删除
     *
     * @param id
     * @return
     */
    @Override
    public Result deleteDel(Integer id) {
        //非空判断
        if (id == null) {
            return Result.error(MessageConstant.ACCOUNT_NOT_FOUND);
        }
        //根据id删除数据
        List<SysMenu> list = list(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getId, id));
        list.forEach(sysMenu -> {
            List<SysMenu> list1 = list(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getPid, sysMenu.getId()));
                    list1.forEach(sysMenu1 ->{
                    removeById(sysMenu1);
                });
                    removeById(sysMenu);

        });
                    removeById(id);
        return Result.success();
    }
}
